物件導向
這單元主要是讓大家了解物件導向的基本實作
物件導向有三大特性:
封裝
類別的內部成員可以封裝起來,讓別人不知道其如何實作,只能透過它提供的公開類別成員來進行操作,封裝的觀念和抽象化類似,但多了安全的概念,使用者只能使用公開的屬性或方法,不可以直接存取類別私有的屬性或方法。
要存取類別私有的屬性或方法,需透過類別公開的方法,而設計師可在這些公開的方法中先做安全性檢查。
例如:一台電視,只要能看就好,使用者不需知道其構造和原理,透過電視的面板或搖控器來進行操作如果電視沒有封裝,使用者看電視時會許就得自己把電線找出來接在一起 ⇒ 操作複雜且不安全
繼承
繼承讓程式碼可以重複使用。就以車子、汽車與卡車的例子來說吧。我們把大部分重複的程式碼寫在車子的類別裡,以後的十種汽車跟八種卡車都可以直接享用車子中已經定義好的程式碼與功能。我們因此縮短了浪費在重複性工作上的時間。
多型
多型跟繼承有很大的關係,以老鷹與企鵝來比喻:
老鷹與企鵝都是繼承鳥綱但是兩者最快速移動方式
老鷹是飛翔,企鵝是游泳,他們都繼承鳥類所有繼承特徵與行為,但移動的行為老鷹是在天上飛最快,企鵝在海裡遊最快,同樣都是移動,但行為不同,結果一樣這就是多型
。
一、物件封裝範例
這篇主要在介紹物件封裝
有一個Rectangle物件。 它有長度(length)和寬度(width)的屬性。 根據設計,它可能需要接受這些屬性的值,計算面積和顯示細節的方法。
void作為方法的傳回類型或區域函數,來指定方法不會傳回值。
double作為使用計算浮點數值型別類型
實際操作基本程式碼:
class Rectangle
{
// member variables
double length;
double width;
public void Acceptdetails()
{
length = 10.0;
width = 20.1;
}
public double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("Length: {0}, Width:{0}, Area:{0}", length, width, GetArea());
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.Acceptdetails();
r.Display();
Console.ReadLine();
}
}
輸出的值為:
Length: 10,
Width: 20.1,
Area: 201
換個題型操作實例:
在下面的範例中,函式GetArea()沒有使用任何存取說明符宣告。如果沒有使用任何一個存取說明符的類成員, 預設使用的是私有的。
using System;
namespace RectangleApplication
{
class Rectangle
{
//member variables
internal double length;
internal double width;
double GetArea()
{
return length * width;
}
public void Display()
{
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}//end class Rectangle
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.length = 12.5;
r.width = 8.25;
r.Display();
Console.ReadLine();
}
}
}
輸出值為:
Length: 12.5
Width: 8.25
Area: 103.125
接下來我們來動動腦,做幾個簡單的小遊戲吧
範例一
建立物件的方式為:new Class名稱()
public class Student
{
//宣告變數
public int StudentID;
public string Name;
public int Grade;
//Method
public string Say()
{
return $"我叫{Name},我是{Grade}年級的學生";
}
public string Talk(int sgrade, string sname)
{
return $"{Grade}年級的{Name}對{sgrade}年級的{sname}說Hello";
}
}
namespace Demo
,那表單引入方法即為:using Demo;
) private void button1_Click(object sender, EventArgs e)
{
Student s = new Student();
s.Name = "老王";
s.Grade = 3;
MessageBox.Show(s.Talk(2, "小明"));
//3年級的老王對2年級的小明說Hello
MessageBox.Show(s.Say());
//我叫老王,我是3年級的學生
}
範例二
//method
public int max(int a, int b)
{
int result;
if (a < b)
{
result = b;
} else
{
result = a;
}
return result;
}
private void button1_Click(object sender, EventArgs e)
{
//建立一個新物件m
Person m = new Person();
int a = 10;
int b = 20;
int c = m.max(a, b);
//Number前面加"",是強制將數字轉為字串
MessageBox.Show("" + c); //20
}
範例三
再來創建一個小遊戲,讓大家能夠一起練習
class Person
{
//創建變數
public String Name;
public int Money;
public Person(String name, int money)
{
this.Name = name;
this.Money = money;
}
public void borrow(Person lender, int money)
{
//如果朋友的錢 >= 我借的數量
if (lender.Money >= money)
{
lender.Money -= money; //跟朋友借錢,則朋友的戶頭會減少
this.Money += money; //我的戶頭增加
}
}
public void repay(Person lender, int money)
{
//如果我的錢 >= 我借的錢
if (this.Money >= money)
{
this.Money -= money; //還給朋友錢時,自己的戶頭會減少
lender.Money += money; //朋友的戶頭錢變多
}
}
}
public partial class Form1 : Form
{
Person my, friend;
public Form1()
{
InitializeComponent();
}
private void submit_Click(object sender, EventArgs e)
{
my = new Person(myInput.Text, 0);
friend = new Person(friendInput.Text, 20000);
myInput.Enabled = false;
friendInput.Enabled = false;
submit.Enabled = false;
borrowButton.Enabled = true;
repayButton.Enabled = true;
borrowButton.Text = $"跟{friend.Name}借了$1000";
repayButton.Text = $"償還{friend.Name}$1000";
myNameLabel.Text = $"{my.Name}";
friendNameLabel.Text = $"{friend.Name}";
}
private void borrowButton_Click(object sender, EventArgs e)
{
my.borrow(friend, 1000);
updateMoney();
}
private void repayButton_Click(object sender, EventArgs e)
{
my.repay(friend, 1000);
updateMoney();
}
private void updateMoney()
{
myMoneyLabel.Text = "" + my.Money;
friendMoneyLabel.Text = "" + friend.Money;
}
}